package com.qf.automation.sms.service.impl;

import com.qf.automation.sms.dao.SmsDao;
import com.qf.automation.sms.inf.SMSInf;
import com.qf.automation.sms.model.SMS;
import com.qf.automation.sms.model.SMSExample;
import com.qf.automation.sms.service.SMSService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service
public class SMSServiceImpl implements SMSService {
    @Resource
    private SmsDao smsDao;
    private SMSInf executor;
    public void setExecutor(SMSInf executor) {
        this.executor = executor;
    }



//查询数据库是否拥有信息，信息是否超过一分钟，如果超过一分钟那就重新获取验证码，
//    获取到验证码之后再次确认验证码，
    @Override
    public boolean send(String phoneNo, String code) {
        //查询数据库，这个手机号上一次发送短信的时间是多少
        //判断时间是否在1分钟之内，如果是就直接返回false
        SMSExample example=new SMSExample();
        SMSExample.Criteria criteria = example.createCriteria();
        criteria.andPhonenoEqualTo(phoneNo);
        List<SMS> sms = smsDao.selectByExample(example);
        if (sms!=null&&sms.size()>0){
            long time = sms.get(0).getTime();
            if (System.currentTimeMillis()-time<60*1000){
                return false;
            }
        }
        //如果不是一分钟之内的验证码 那就重新发送短信  如果发送成功就返回true并判断是否数据库有数据，有就修改，没有就重新输入一个新的
        //调用第三方服务

        boolean result = executor.send(phoneNo, code);
        //再根据发送结果查看是否存入数据库当中，如果是真那就再次放入数据库，只不过放入之前得再次查看数据库是否有，如果有就更新，
//        如果没有那就重新放入一条新的数据
        if (result){
            //具体的调用的短信第三方服务成功了
            //短信已经发送至用户手机上
            //把短信验证码和手机号和当前时间，放入数据库中。
            //到底是update还是insert需要判断。
            if (sms!=null&&sms.size()>0){
                SMS sms1=new SMS();
                sms1.setCode(code);
                sms1.setTime(System.currentTimeMillis());
                smsDao.updateByExampleSelective(sms1,example);
                return true;
            }else{
                SMS sms1=new SMS();
                sms1.setPhoneno(phoneNo);
                sms1.setCode(code);
                sms1.setTime(System.currentTimeMillis());
                smsDao.insertSelective(sms1);
                return true;
            }
        }else {
            return false;

        }




    }
    private static final long SMS_ALIVE_TIME=1000*60*5;
    @Override
    public int check(String phoneNo, String code) {
        SMSExample example=new SMSExample();
        SMSExample.Criteria criteria = example.createCriteria();
        criteria.andPhonenoEqualTo(phoneNo);
        criteria.andCodeEqualTo(code);
        //查询验证码

        List<SMS> sms = smsDao.selectByExample(example);
        if (sms==null||sms.size()==0){
            //只要没查到就是验证码校验错误

            return 1;
        }else {
            long time =sms.get(0).getTime();
            if (System.currentTimeMillis()-time>SMS_ALIVE_TIME){
                //查到了，但是如果超时，也是不可以的。

                return 2;
            }else {
                //验证码查到了，并且也没有超时，返回验证成功
                //删除验证码
                //验证码应该一次有效，对吗
                smsDao.deleteByExample(example);
                return 0;
            }
        }
    }
}
